Welcome to my editing guide for Bubble Bobble on the Arcade. Here I'll teach you how to edit Bubble Bobble levels using Karl Stenerud's program Patch-A-Bobble and a hex editor. ======================= = What will you need? = ======================= • MAME. You will also need a MAME frontend like mGalaxy for running modified arcade games, as raw MAME currently won't run them anymore. I've heard people say MAME would be able to run them in the past despite complaining about a checksum issue, but not anymore. MAME can be found at http://www.mame.net/, mGalaxy http://www.mgalaxy.com/ • bublbobl and bublboblr ROMs. Patch-A-Bobble needs the regular ROM files from bublbobl as well as either a78-05.52, a78-24.52 or a78-21.52, of which I found a78-24.52 in bublboblr. • Patch-A-Bobble, to edit the levels. Found at http://www.romhacking.net/utilities/142/ • A hex editor. I use HxD, but it's your choice as to which one you use. You can download HxD at https://mh-nexus.de/en/hxd/ • A file archiver to unzip the ROM files so you can edit them. I use 7-zip, since it's free. http://www.7-zip.org/download.html • Some knowledge on hexadecimal. ======================= = General Information = ======================= The fact that editing Bubble Bobble on Arcade requires both Patch-A-Bobble and a hex editor can be traced down to one single but major flaw with Patch-A-Bobble; it doesn't let you insert Drunks. Drunks are the enemies in green cloaks that throw wine bottles introduced on Level 50 in the original game. To insert Drunks, you'll need a hex editor. Fortunately, I finally figured out how to do it and I'm going to teach you how. I'd highly recommend using Patch-A-Bobble to edit levels and enemies, and only using a hex editor to insert Drunks. ========================== = Patch-A-Bobble Example = ========================== I'll give you an example as to what to do: First, I open up Patch-A-Bobble. The first time you open it, it will complain that it can't find the ROMs. You'll have to enter the directory where your ROMs are stored. So long as you have fresh ROMs and any one of the above ROMs I explicitly mentioned, opening any of them will load the editor. I then edit my level. Patch-A-Bobble comes with a readme that will teach you how to use it. Let's say I replace the Zhen-Chans on Level 1 with Mightas, the enemies in white cloaks that throw rocks. Once done, I save my level. Loading up the game using the mGalaxy frontend will greet me with three Mightas on Level 1. ======================== = Power of Hex Editing = ======================== But how, you may ask, do I insert Drunks? Well, this is where things get a bit complicated. As I said above, inserting Drunks requires a hex editor, so I open my hex editor and use it to open the file a78-24.52 (this file contains level and enemy data for the game). I then use the Find function to locate hex offset 0x673E. 0x673E-0x6740 contains the enemy data for Level 1, and there is a difference of 0x2B (43 in decimal) offsets between that and the enemy data for Level 2. There is also a difference of 0x2B between the enemy data of Level 2 and Level 3, and so on and so forth, 0x2B everytime. But back to Level 1. My three offsets for Level 1 currently reads "00 30 00". If the file was unmodified, it would read "30 00 00". What does this mean? Well, there are six digits here, and the "3" here means there are three enemies in the level. Its location reveals what kind of enemies they are. From left to right, they are: Zhen-Chan, Banebou, Mighta, Hidegon, Pulpul, Monsta. That means that if I were to change it to "03 00 00", the three Mightas would be replaced with three Banebous, "00 00 30" three Pulpuls, "00 03 00" three Hidegons, etc. But there are two more enemies in the game, Drunks and Invaders. You can tick a box in Patch-A-Bobble to replace all the Zhen-Chans in a level with Invaders, but the Drunk is more tricky. The Drunk and Invader offset for a level are located six offsets to the right of the last of the three offsets that control the other enemies, in Level 1's case 0x6746. Right now it's "00". Changing that offset to "01" will replace all the Zhen-Chans in the level with Invaders, and after much trial and error I found you can replace all the Mightas in the level with Drunks by simply changing that same offset to "10". Finally, Changing the offset to "11" will replace both the Zhen-Chans and Mightas with Invaders and Drunks, respectively. Due to the way the game is programmed, it is impossible to have both Zhen-Chans and Invaders in the same level. Likewise, it is impossible to have both Mightas and Drunks in the same level. The original abides by those rules, too. There is also a 0x2B difference between each Invader and Drunk offset starting from 0x6746. In case you're still confused, here is a table for you: =============== = Table Guide = =============== Level 1 Enemy Offsets: 0x673E-0x6740 Invader/Drunk Offset: 0x6746 Level 2 Enemy Offsets: 0x6769-0x676B Invader/Drunk Offset: 0x6771 Level 3 Enemy Offsets: 0x6794-0x6796 Invader/Drunk Offset: 0x679C Level 4 Enemy Offsets: 0x67BF-0x67C1 Invader/Drunk Offset: 0x67C7 Level 5 Enemy Offsets: 0x67EA-0x67EC Invader/Drunk Offset: 0x67F2 Level 6 Enemy Offsets: 0x6815-0x6817 Invader/Drunk Offset: 0x681D Level 7 Enemy Offsets: 0x6840-0x6842 Invader/Drunk Offset: 0x6848 Level 8 Enemy Offsets: 0x686B-0x686D Invader/Drunk Offset: 0x6873 Level 9 Enemy Offsets: 0x6896-0x6898 Invader/Drunk Offset: 0x689E Level 10 Enemy Offsets: 0x68C1-0x68C3 Invader/Drunk Offset: 0x68C9 Level 11 Enemy Offsets: 0x68EC-0x68EE Invader/Drunk Offset: 0x68F4 Level 12 Enemy Offsets: 0x6917-0x6919 Invader/Drunk Offset: 0x691F Level 13 Enemy Offsets: 0x6942-0x6944 Invader/Drunk Offset: 0x694A Level 14 Enemy Offsets: 0x696D-0x696F Invader/Drunk Offset: 0x6975 Level 15 Enemy Offsets: 0x6998-0x699A Invader/Drunk Offset: 0x69A0 Level 16 Enemy Offsets: 0x69C3-0x69C5 Invader/Drunk Offset: 0x69CB Level 17 Enemy Offsets: 0x69EE-0x69F0 Invader/Drunk Offset: 0x69F6 Level 18 Enemy Offsets: 0x6A19-0x6A1B Invader/Drunk Offset: 0x6A21 Level 19 Enemy Offsets: 0x6A44-0x6A46 Invader/Drunk Offset: 0x6A4C Level 20 Enemy Offsets: 0x6A6F-0x6A71 Invader/Drunk Offset: 0x6A77 Level 21 Enemy Offsets: 0x6A9A-6A9C Invader/Drunk Offset: 0x6AA2 Level 22 Enemy Offsets: 0x6AC5-0x6AC7 Invader/Drunk Offset: 0x6ACD Level 23 Enemy Offsets: 0x6AF0-0x6AF2 Invader/Drunk Offset: 0x6AF8 Level 24 Enemy Offsets: 0x6B1B-0x6B1D Invader/Drunk Offset: 0x6B23 Level 25 Enemy Offsets: 0x6B46-0x6B48 Invader/Drunk Offset: 0x6B4E Level 26 Enemy Offsets: 0x6B71-0x6B73 Invader/Drunk Offset: 0x6B79 Level 27 Enemy Offsets: 0x6B9C-0x6B9E Invader/Drunk Offset: 0x6BA4 Level 28 Enemy Offsets: 0x6BC7-0x6BC9 Invader/Drunk Offset: 0x6BCF Level 29 Enemy Offsets: 0x6BF2-0x6BF4 Invader/Drunk Offset: 0x6BFA Level 30 Enemy Offsets: 0x6C1D-0x6C1F Invader/Drunk Offset: 0x6C25 Level 31 Enemy Offsets: 0x6C48-0x6C4A Invader/Drunk Offset: 0x6C50 Level 32 Enemy Offsets: 0x6C73-0x6C75 Invader/Drunk Offset: 0x6C7B Level 33 Enemy Offsets: 0x6C9E-0x6CA0 Invader/Drunk Offset: 0x6CA6 Level 34 Enemy Offsets: 0x6CC9-0x6CCB Invader/Drunk Offset: 0x6CD1 Level 35 Enemy Offsets: 0x6CF4-0x6CF6 Invader/Drunk Offset: 0x6CFC Level 36 Enemy Offsets: 0x6D1F-0x6D21 Invader/Drunk Offset: 0x6D27 Level 37 Enemy Offsets: 0x6D4A-0x6D4C Invader/Drunk Offset: 0x6D52 Level 38 Enemy Offsets: 0x6D75-0x6D77 Invader/Drunk Offset: 0x6D7D Level 39 Enemy Offsets: 0x6DA0-0x6DA2 Invader/Drunk Offset: 0x6DA8 Level 40 Enemy Offsets: 0x6DCB-0x6DCD Invader/Drunk Offset: 0x6DD3 Level 41 Enemy Offsets: 0x6DF6-0x6DF8 Invader/Drunk Offset: 0x6DFE Level 42 Enemy Offsets: 0x6E21-0x6E23 Invader/Drunk Offset: 0x6E29 Level 43 Enemy Offsets: 0x6E4C-0x6E4E Invader/Drunk Offset: 0x6E54 Level 44 Enemy Offsets: 0x6E77-0x6E79 Invader/Drunk Offset: 0x6E7F Level 45 Enemy Offsets: 0x6EA2-0x6EA4 Invader/Drunk Offset: 0x6EAA Level 46 Enemy Offsets: 0x6ECD-0x6ECF Invader/Drunk Offset: 0x6ED5 Level 47 Enemy Offsets: 0x6EF8-0x6EFA Invader/Drunk Offset: 0x6F00 Level 48 Enemy Offsets: 0x6F23-0x6F25 Invader/Drunk Offset: 0x6F28 Level 49 Enemy Offsets: 0x6F4E-0x6F50 Invader/Drunk Offset: 0x6F56 Level 50 Enemy Offsets: 0x6F79-0x6F7B Invader/Drunk Offset: 0x6F81 Level 51 Enemy Offsets: 0x6FA4-0x6FA6 Invader/Drunk Offset: 0x6FAC Level 52 Enemy Offsets: 0x6FCF-0x6FD1 Invader/Drunk Offset: 0x6FD7 Level 53 Enemy Offsets: 0x6FFA-0x6FFC Invader/Drunk Offset: 0x7002 Level 54 Enemy Offsets: 0x7025-0x7027 Invader/Drunk Offset: 0x702D Level 55 Enemy Offsets: 0x7050-0x7052 Invader/Drunk Offset: 0x7058 Level 56 Enemy Offsets: 0x707B-0x707D Invader/Drunk Offset: 0x7083 Level 57 Enemy Offsets: 0x70A6-0x70A8 Invader/Drunk Offset: 0x70AE Level 58 Enemy Offsets: 0x70D1-0x70D3 Invader/Drunk Offset: 0x70D9 Level 59 Enemy Offsets: 0x70FC-0x70FE Invader/Drunk Offset: 0x7104 Level 60 Enemy Offsets: 0x7127-0x7129 Invader/Drunk Offset: 0x712F Level 61 Enemy Offsets: 0x7152-0x7154 Invader/Drunk Offset: 0x715A Level 62 Enemy Offsets: 0x717D-0x717F Invader/Drunk Offset: 0x7185 Level 63 Enemy Offsets: 0x71A8-0x71AA Invader/Drunk Offset: 0x71B0 Level 64 Enemy Offsets: 0x71D3-0x71D5 Invader/Drunk Offset: 0x71DB Level 65 Enemy Offsets: 0x71FE-0x7200 Invader/Drunk Offset: 0x7206 Level 66 Enemy Offsets: 0x7229-0x722B Invader/Drunk Offset: 0x7231 Level 67 Enemy Offsets: 0x7254-0x7256 Invader/Drunk Offset: 0x725C Level 68 Enemy Offsets: 0x727F-0x7281 Invader/Drunk Offset: 0x7287 Level 69 Enemy Offsets: 0x72AA-0x72AC Invader/Drunk Offset: 0x72B2 Level 70 Enemy Offsets: 0x72D5-0x72D7 Invader/Drunk Offset: 0x72DD Level 71 Enemy Offsets: 0x7300-0x7302 Invader/Drunk Offset: 0x7308 Level 72 Enemy Offsets: 0x732B-0x732D Invader/Drunk Offset: 0x7333 Level 73 Enemy Offsets: 0x7356-0x7358 Invader/Drunk Offset: 0x735E Level 74 Enemy Offsets: 0x7381-0x7383 Invader/Drunk Offset: 0x7389 Level 75 Enemy Offsets: 0x73AC-0x73AD Invader/Drunk Offset: 0x73B4 Level 76 Enemy Offsets: 0x73D7-0x73D9 Invader/Drunk Offset: 0x73DF Level 77 Enemy Offsets: 0x7402-0x7404 Invader/Drunk Offset: 0x740A Level 78 Enemy Offsets: 0x742D-0x742F Invader/Drunk Offset: 0x7435 Level 79 Enemy Offsets: 0x7458-0x745A Invader/Drunk Offset: 0x7460 Level 80 Enemy Offsets: 0x7483-0x7485 Invader/Drunk Offset: 0x748B Level 81 Enemy Offsets: 0x74AE-0x74B0 Invader/Drunk Offset: 0x74B6 Level 82 Enemy Offsets: 0x74D9-0x74DB Invader/Drunk Offset: 0x74E1 Level 83 Enemy Offsets: 0x7504-0x7506 Invader/Drunk Offset: 0x750C Level 84 Enemy Offsets: 0x752F-0x7531 Invader/Drunk Offset: 0x7537 Level 85 Enemy Offsets: 0x755A-0x755C Invader/Drunk Offset: 0x7562 Level 86 Enemy Offsets: 0x7585-0x7587 Invader/Drunk Offset: 0x758D Level 87 Enemy Offsets: 0x75B0-0x75B2 Invader/Drunk Offset: 0x75B8 Level 88 Enemy Offsets: 0x75DB-0x75DD Invader/Drunk Offset: 0x75E3 Level 89 Enemy Offsets: 0x7606-0x7608 Invader/Drunk Offset: 0x760E Level 90 Enemy Offsets: 0x7631-0x7633 Invader/Drunk Offset: 0x7639 Level 91 Enemy Offsets: 0x765C-0x765E Invader/Drunk Offset: 0x7664 Level 92 Enemy Offsets: 0x7687-0x7689 Invader/Drunk Offset: 0x768F Level 93 Enemy Offsets: 0x76B2-0x76B4 Invader/Drunk Offset: 0x76BA Level 94 Enemy Offsets: 0x76DD-0x76DF Invader/Drunk Offset: 0x76E5 Level 95 Enemy Offsets: 0x7708-0x770A Invader/Drunk Offset: 0x7710 Level 96 Enemy Offsets: 0x7733-0x7735 Invader/Drunk Offset: 0x773B Level 97 Enemy Offsets: 0x775E-0x7760 Invader/Drunk Offset: 0x7766 Level 98 Enemy Offsets: 0x7789-0x778B Invader/Drunk Offset: 0x7791 Level 99 Enemy Offsets: 0x77B4-0x77B6 Invader/Drunk Offset: 0x77BC ============================ = THIS STORY IS HAPPY END! = ============================ And that's the end of the table! I thank you for your time and patience reading this, and I hope this helps you with hacking Bubble Bobble on the Arcade. Good luck! ===================== = Credits! Zzzzz... = ===================== I guess this is where I write the credits that nobody reads. First, I thank the developers at TAITO for making Bubble Bobble in the first place. I also thank the developers of MAME, a great arcade emulator as well as the developers at mGalaxy, whom without playing edited arcade games would not be possible. Karl Stenerud, a thank you to you for writing Patch-A-Bobble, which despite its Drunk flaw is a great editor. Okay, now I'm really done. Happy hacking, everybody!